import { strict as assert } from 'node:assert';
import { By, until } from 'selenium-webdriver';
import { describe, it, before, after } from 'mocha';
import { createDriver, BASE_URL, ensureServerUp } from './setup.mjs';
import { login } from './common.mjs';

describe('数据导出页面 E2E', function () {
  this.timeout(60000);
  let driver;

  before(async function () {
    await ensureServerUp(60000);
    driver = await createDriver();
    await driver.manage().setTimeouts({
      implicit: 0,
      pageLoad: 60000,
      script: 30000
    });
    await login(driver);
  });

  after(async function () {
    if (driver) {
      await driver.quit();
    }
  });

  it('应加载数据导出页面', async function () {
    await driver.get(`${BASE_URL}/data-export`);
    
    // 等待页面加载
    await driver.sleep(2000);
    
    // 处理可能出现的 alert 弹窗（需要在任何其他操作之前处理）
    // 使用轮询方式检查 alert，因为 alert 可能在页面加载后异步出现
    let alertHandled = false;
    for (let i = 0; i < 5; i++) {
      try {
        const alert = await driver.switchTo().alert();
        const alertText = await alert.getText();
        console.log(`检测到 alert: ${alertText}`);
        await alert.accept(); // 关闭 alert
        alertHandled = true;
        await driver.sleep(500);
        break;
      } catch (e) {
        // 没有 alert，等待一下再试
        await driver.sleep(500);
      }
    }
    
    // 如果处理了 alert，再等待一下确保页面稳定
    if (alertHandled) {
      await driver.sleep(1000);
    }
    
    // 检查页面是否加载（使用更安全的方式）
    try {
      const content = await driver.getPageSource();
      assert.ok(content.length > 0, '数据导出页面应加载');
    } catch (e) {
      // 如果仍然有 alert，尝试再次处理
      try {
        const alert = await driver.switchTo().alert();
        await alert.accept();
        await driver.sleep(500);
        const content = await driver.getPageSource();
        assert.ok(content.length > 0, '数据导出页面应加载');
      } catch (e2) {
        // 如果还是失败，至少验证页面 URL 是正确的
        const currentUrl = await driver.getCurrentUrl();
        assert.ok(currentUrl.includes('data-export'), '应导航到数据导出页面');
      }
    }
  });
});

